<?php

/**
 * Classe que representa uma modalidade. Cada uma delas tem uma Pró-reitoria, um nome,
 * um valor fixo em reais e um tempo de duração, dito como validade.
 *
 * @author Sergio Lisan
 */
abstract class Modalidade {

	var $id;
	var $nome;
	var $proreitoria;
	var $valor;
	var $vencimento;

	public function __construct() {
	}

	abstract public function validate($aluno);

}

/**
 * Classe que abstrai uma ProReitoria
 * @author Sergio Lisan
 *
 */
class ProReitoria {
	
	var $id;
	var $sigla;
	
	public function __construct() {
		
	}
	
}

/**
 * Categoria de modalidade de bolsas que permite uma acumulacao, mas possui certas restricoes
 * que impedem que uma bolsa desta modalidade possa ser acumulada.
 *
 * @author Sergio Lisan
 *
 */
class Acumulativa extends Modalidade {

	var $restricoes;

	public function __construct() {
	}

	/**
	 * Validacao de restricoes para bolsas Acumulativas
	 * @param Aluno $aluno
	 * @return retorna um erro ou mensagem de sucesso
	 */
	public function validate($aluno) {
		$bolsas = $aluno->bolsas;
		foreach($bolsas as $bolsa) {
			if (in_array($bolsa, $restricoes))
				return "[INVALIDADA] Essa bolsa entra não pode ser acumulada com ".$restricoes;
		}
		
		return true;
	}
}

/**
 * Categoria de modalidade de bolsas que nao podem acumular com outras bolsas.
 *
 * @author Sergio Lisan
 *
 */
class NaoAcumulativa extends Modalidade {

	public function __construct() {
	}

	/**
	 * Validacao de bolsas nao acumulativas
	 * @param Aluno $aluno
	 * @return mensagem de erro ou sucesso
	 */
	public function validate($aluno) {
		$bolsas = $aluno->bolsas;
		foreach($bolsas as $bolsa) {
			if ( !($bolsa instanceof Beneficio) ) {
				return "[Invalidado] Essa bolsa não pode ser acumulada com outras bolsas.";
			}
		}		
		return true;
	}

}

/**
 * Classe que representa um beneficio, que pode ser acumulado com Bolsas acumulativas ou
 * Bolsas NaoAcumulativas, durante um determinado periodo.
 *
 * @author Sergio Lisan
 *
 */
class Beneficio extends Modalidade {

	public function __construct() {
	}

	public function validate($aluno) {
		// TODO criar logica que valida se o aluno ja pegou um beneficio antes e o tempo de expiação nao terminou.
		return true;
	}

}
